#ifndef __APP_UDP_H__
#define __APP_UDP_H__

#include <stdint.h>

#ifdef __cplusplus
extern "C" {
#endif

#define APP_UDP_PORT        (10241)

// 命令定义
typedef enum
{
    CMD_QUERY_ELECTRICAL_DATA = 0x01,               // 查询电气参数命令
    CMD_SET_SWITCH_STATE = 0x02,                    // 设置开关状态命令
    CMD_QUERY_SWITCH_STATE = 0x03,                  // 查询开关状态命令
    CMD_QUERY_ENERGY_STORAGE_COUNT = 0x04,          // 查询能量存储记录总数
    CMD_QUERY_ENERGY_STORAGE_INDEX_RECORD = 0x05,   // 查询指定索引的能量存储记录
    CMD_QUERY_ENERGY_STORAGE_DATE_RECORD = 0x06,    // 查询指定日期能量存储记录
    CMD_ADD_TIMER_EVENT = 0x07,                     // 添加定时事件
    CMD_DELETE_TIMER_EVENT = 0x08,                  // 删除定时事件
    CMD_QUERY_TIMER_EVENTS = 0x09,                  // 查询定时事件列表
    CMD_UPDATE_TIMER_EVENT = 0x0A,                  // 更新定时事件
    CMD_SET_CHILD_LOCK = 0x0B,                      // 设置儿童安全锁
    CMD_QUERY_CHILD_LOCK = 0x0C,                    // 查询儿童安全锁状态
    CMD_SET_LED_STATE = 0x0D,                       // 设置LED状态
    CMD_QUERY_LED_STATE = 0x0E,                     // 查询LED状态
    CMD_SET_POWER_ON_STATE = 0x0F,                  // 设置断电后上电状态
    CMD_QUERY_POWER_ON_STATE = 0x10,                // 查询断电后上电状态
    CMD_QUERY_CONFIG = 0x11,                        // 查询配置参数
    CMD_SET_CONFIG = 0x12,                          // 设置配置参数
    CMD_OTA_UPDATE = 0x13,                          // OTA升级
    CMD_QUERY_DEVICE_INFO = 0x14,                   // 查询设备信息

    CMD_FACTORY_RESET = 0xB0,                       // 恢复出厂设置
    CMD_REBOOT = 0xB1,                              // 重启设备
} local_cmd_type_t;

// 定时器命令数据结构
typedef struct __attribute__((packed)) {
    uint8_t type;          // 定时器类型: 0=单次, 1=每天, 2=每周, 3=时间段
    uint8_t action;        // 动作类型: 0=开启, 1=关闭, 2=切换
    uint8_t hour;          // 小时(0-23)
    uint8_t minute;        // 分钟(0-59)
    uint8_t second;        // 秒(0-59)
    uint8_t day_mask;      // 周掩码(bit0=周一...bit6=周日)
    uint8_t end_action;    // 结束动作(仅时间段模式有效)
    uint8_t end_hour;      // 结束时间：小时
    uint8_t end_minute;    // 结束时间：分钟
    uint8_t end_second;    // 结束时间：秒
    uint8_t enabled;       // 是否启用
} timer_add_cmd_t;         // 添加定时器命令

typedef struct __attribute__((packed)) {
    uint8_t timer_id;      // 定时器ID
} timer_delete_cmd_t;      // 删除定时器命令

typedef struct __attribute__((packed)) {
    uint8_t timer_id;      // 定时器ID
    timer_add_cmd_t config;// 新的定时器配置
} timer_update_cmd_t;      // 更新定时器命令

// 设备信息数据结构
typedef struct __attribute__((packed)) {
    char mac[18];           // MAC地址
    char version[32];       // 版本号
} device_info_t;

/**
 * @brief 初始化 UDP 套接字
 * 
 * @return 0 成功，-1 失败
 */
int app_udp_init(void);

/**
 * @brief 发送 UDP 数据
 * 
 * @param data 数据
 * @param len 数据长度
 * @param ip IP 地址
 * @param port 端口号
 */
int app_udp_send(const char *data, int len, const char *ip, int port);

/**
 * @brief 发送 UDP 数据
 * 
 * @param cmd 命令
 * @param data 数据
 * @param data_len 数据长度
 * @return 成功返回 发送字节数，失败返回 -1
 */
int app_udp_package_send(local_cmd_type_t cmd, const uint8_t *data, uint16_t data_len);

#ifdef __cplusplus
}
#endif

#endif
